import uni from '@dcloudio/uni-app';

let webSocketTask = null; // WebSocket 任务实例
let isReconnecting = false; // 重连标记
let reconnectTimes = 0; // 重连次数
const RECONNECT_INTERVAL = 5000; // 重连间隔（5秒）
const MAX_RECONNECT_TIMES = 3; // 最大重连次数

// WebSocket 配置（可通过 connect 方法动态修改）
let WS_CONFIG = {
  url: '', // 后端 WebSocket 地址（必填，示例：'ws://your-domain.com/ws/endpoint'）
  header: {}, // 自定义请求头（WebSocket 不支持，仅作兼容）
  timeout: 15000 // 超时时间
};

// 事件回调存储
const wsCallbacks = {
  onOpen: null,
  onMessage: null,
  onClose: null,
  onError: null
};

// 初始化 WebSocket 连接
function initWebSocket() {
  // 检查 URL 是否合法
  if (!WS_CONFIG.url) {
    console.error('WebSocket URL 未配置，请通过 ws.connect() 传入');
    return;
  }

  // 创建连接任务
  webSocketTask = uni.connectSocket({ url: WS_CONFIG.url });

  // 监听连接打开
  uni.onSocketOpen((res) => {
    console.log('[WS] 连接成功', res);
    reconnectTimes = 0; // 重置重连次数
    wsCallbacks.onOpen?.();
  });

  // 监听消息接收
  uni.onSocketMessage((res) => {
    console.log('[WS] 收到消息', res.data);
    wsCallbacks.onMessage?.(res.data);
  });

  // 监听连接关闭
  uni.onSocketClose((res) => {
    console.log('[WS] 连接关闭', res);
    wsCallbacks.onClose?.();
    // 自动重连（非主动关闭且未达最大重连次数）
    if (!isReconnecting && res.code !== 1000 && reconnectTimes < MAX_RECONNECT_TIMES) {
      startReconnect();
    }
  });

  // 监听连接错误
  uni.onSocketError((res) => {
    console.error('[WS] 连接错误', res);
    wsCallbacks.onError?.();
    // 触发重连
    startReconnect();
  });
}

// 开始重连
function startReconnect() {
  if (isReconnecting) return;
  isReconnecting = true;
  console.log(`[WS] 开始第 ${reconnectTimes + 1} 次重连...`);
  setTimeout(() => {
    closeWebSocket(); // 先关闭旧连接
    initWebSocket(); // 初始化新连接
    reconnectTimes++;
    isReconnecting = false;
  }, RECONNECT_INTERVAL);
}

// 关闭连接
function closeWebSocket() {
  if (webSocketTask) {
    uni.closeSocket();
    webSocketTask = null;
    // 移除所有事件监听（避免内存泄漏）
    uni.offSocketOpen();
    uni.offSocketMessage();
    uni.offSocketClose();
    uni.offSocketError();
  }
}

// 发送消息（支持文本/JSON）
function sendMessage(data) {
  if (webSocketTask && webSocketTask.readyState === 1) { // 1 表示 OPEN 状态
    uni.sendSocketMessage({ data: typeof data === 'object' ? JSON.stringify(data) : data });
  } else {
    console.warn('[WS] 未连接或连接已关闭，消息发送失败');
  }
}

// 对外暴露的接口
export default {
  /**
   * 初始化 WebSocket 连接
   * @param {Object} options 配置项
   * @param {string} options.url WebSocket 地址（必填，示例：'ws://your-domain.com/ws/endpoint?token=xxx'）
   */
  connect(options) {
    WS_CONFIG = { ...WS_CONFIG, ...options };
    closeWebSocket(); // 先关闭可能存在的旧连接
    initWebSocket();
  },

  /**
   * 注册事件回调
   * @param {string} event 事件类型（open/message/close/error）
   * @param {Function} callback 回调函数
   */
  on(event, callback) {
    if (['open', 'message', 'close', 'error'].includes(event)) {
      wsCallbacks[`on${event.charAt(0).toUpperCase() + event.slice(1)}`] = callback;
    }
  },

  /**
   * 发送消息
   * @param {string|Object} data 消息内容（对象会自动转为 JSON 字符串）
   */
  send: sendMessage,

  /**
   * 主动关闭连接
   */
  close: closeWebSocket,

  /**
   * 获取当前连接状态（0: 未连接, 1: 已连接, 2: 正在关闭, 3: 已关闭）
   */
  get readyState() {
    return webSocketTask ? webSocketTask.readyState : 0;
  }
};